package com.sheng.leetcode.year2022.month12.day11;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/12/12
 * <p>
 * 1827. 最少操作使数组递增<p>
 * <p>
 * 给你一个整数数组  nums  （下标从 0 开始）。每一次操作中，你可以选择数组中一个元素，并将它增加  1  。<p>
 * 比方说，如果  nums = [1,2,3]  ，你可以选择增加  nums[1]  得到  nums = [1,3,3]  。<p>
 * 请你返回使 nums  严格递增  的 最少  操作次数。<p>
 * 我们称数组  nums  是 严格递增的  ，当它满足对于所有的  0 <= i < nums.length - 1  都有  nums[i] < nums[i+1]  。<p>
 * 一个长度为 1  的数组是严格递增的一种特殊情况。<p>
 * <p>
 * 示例 1：<p>
 * 输入：nums = [1,1,1]<p>
 * 输出：3<p>
 * 解释：你可以进行如下操作：<p>
 * 1) 增加 nums[2] ，数组变为 [1,1,2] 。<p>
 * 2) 增加 nums[1] ，数组变为 [1,2,2] 。<p>
 * 3) 增加 nums[2] ，数组变为 [1,2,3] 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：nums = [1,5,2,4,1]<p>
 * 输出：14<p>
 * <p>
 * 示例 3：<p>
 * 输入：nums = [8]<p>
 * 输出：0<p>
 * <p>
 * 提示：<p>
 * 1 <= nums.length <= 5000<p>
 * 1 <= nums[i] <= 10^4<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/minimum-operations-to-make-the-array-increasing">1827. 最少操作使数组递增</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1827 {

    @Test
    public void test01() {
//        int[] nums = {1, 1, 1};
//        int[] nums = {1, 5, 2, 4, 1};
        int[] nums = {8};
        System.out.println(new Solution().minOperations(nums));
    }
}

class Solution {
    public int minOperations(int[] nums) {
        int ans = 0;
        int length = nums.length;
        if (length == 1) {
            return ans;
        }
        for (int i = 1; i < length; i++) {
            if (nums[i] <= nums[i - 1]) {
                ans += nums[i - 1] - nums[i] + 1;
                nums[i] = nums[i - 1] + 1;
            }
        }
        return ans;
//        int pre = nums[0] - 1, res = 0;
//        for (int num : nums) {
//            pre = Math.max(pre + 1, num);
//            res += pre - num;
//        }
//        return res;
    }
}
